#!/usr/bin/python
# -*- coding: utf8 -*-

from pyparsing import Regex

from expresion import Expresion, Exp, makeSintaxis
from naturals import Nat, Zero, Succ

from lenguaje import Extension

# version amigable para notar naturales.
class LiteralNat(Expresion):
    
    def __init__(self, toks):
        """
        Un literalNat esta compuesto por un valor natural.
        """
        self.val = int(toks[0])
    
    def reducir(self):
        """
        Para reducirlo se lo convierte en su equivalente natural, por ejemplo:
        0 --> zero
        1 --> succ(zero)
        N --> succ(succ(succ......(zero))) (N - veces)
        """
        res = Zero([])
        i = self.val
        while i > 0:
            res = Succ([res])
            i = i - 1
        return res
    
    def tipar(self, namespace):
        """
        vacio | > N : Nat
        """
        return Nat([])    
    
    def sustituir(self, var, expresion):
        """
        N {X <- T} --> N
        """
        return self 
        
    @classmethod
    def sintaxis(cls):
        val = Regex('0|[1-9][0-9]*')
        return val    
    
    def __str__(self):
        return str(self.val)
    
extensionLiteralNat = Extension("LiteralNats", expresiones=[LiteralNat])

